package volatileDemo;

import java.util.concurrent.TimeUnit;

/**
 * @author fei
 * @date 2023/1/15 21:24
 * @description volatile 保证可见性
 */
public class VolatileSeeDemo {

    // static boolean flag = true;
    static volatile boolean flag = true;

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t ------come in");
            while(flag){
                // 如果用的是普通变量，这里拿到是这个线程的共享变量的副本，而改为false之后没有通知，所以这里是会一直循环的
                // 如果有用volatile修饰，那么下面更新值后，读的时候就是最新的，所以这里不会一直循环
            }
            System.out.println(Thread.currentThread().getName() + "\t ------flag 被设置为 false，程序停止");
        }, "t1").start();

        // 暂停，是因为有可能 主线程太快，还没进循环就出来了
        try{ TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) { e.printStackTrace(); }
        flag = false;
        System.out.println(Thread.currentThread().getName() + "\t 修改完成 flag：" + flag);
    }

}
